package cn.hinglo.gameclaw.data.utils;


import cn.hinglo.gameclaw.data.exception.ResultException;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import static cn.hinglo.gameclaw.data.utils.FieldUtils.*;

/**
 * @createTime: 2018/1/2
 * @author: HingLo
 * @description: 图片上传，读取的工具类
 */
@Slf4j
public class FileImageUtils {

    public static final String ROOT = rootPath();
    private static final Map<Integer, String> LOCATION = initLocation();


    /***
     * 根据不同的操作系统返回静态资源保存的目录
     * @return 基础文件位置
     */
    private static String rootPath() {
        String os = System.getProperty("os.name");
        if (os.toLowerCase().startsWith("win")) {
            return "D:/Programs/Nginx/html";
        } else {
            //这个是文件的上传目录，同时也是文件下载的读取目录
            return "/root/claw";
        }
    }


    /**
     * 初始化文件位置
     *
     * @return 初始化文件类型保存的位置map
     */
    private static Map<Integer, String> initLocation() {

        Map<Integer, String> map = new HashMap<>(6);
        map.put(IMAGE_1, ROOT + "/static/claw/banner/");
        map.put(IMAGE_2, ROOT + "/static/claw/details/");
        map.put(IMAGE_3, ROOT + "/static/claw/show/");
        map.put(IMAGE_4, ROOT + "/static/claw/header/");
        map.put(IMAGE_5, ROOT + "/static/claw/money/");
        map.put(IMAGE_6, ROOT + "/static/claw/qq/");
        map.put(IMAGE_7, ROOT + "/static/claw/notice/");
        map.put(IMAGE_8, ROOT + "/static/claw/version/");
        map.put(IMAGE_9, ROOT + "/static/claw/article/");
        return map;
    }


    /**
     * 读取图片文件，将转为字节数组
     *
     * @param fileName 文件名称
     * @param type     文件类型，通过文件类型来定位文件夹
     * @return 文件的字节
     */
    public static byte[] readImageUtils(String fileName, int type) {

        //文件名称是空白或者是null的时候就直接返回
        if (StrUtil.isBlank(fileName)) {
            return null;
        }

        String path = readUrlUtils(type) + fileName;
        File file = new File(path);
        if (!file.isFile()) {
            //如果文件不是文件，就直接就设置为默认图片
            file = new File(ROOT + "/default.png");
        }
        try {
            return FileUtil.readBytes(file);
        } catch (IORuntimeException e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 保存文件
     *
     * @param file     需要保存的文件对象
     * @param fileName 保存的名称
     * @param type     文件类型，根据类型确定文件保存位置
     * @return 是否保存成功
     */
    public static boolean saveImageUtils(MultipartFile file, String fileName, int type) {
        //文件名称是空白或者是null的时候就直接返回
        if (StrUtil.isBlank(fileName)) {
            return false;
        }

        String path = readUrlUtils(type);
        path += fileName;
        try {
            FileUtil.writeBytes(file.getBytes(), path);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static boolean saveImageUtils(byte[] file, String fileName, int type) {
        //文件名称是空白或者是null的时候就直接返回
        if (StrUtil.isBlank(fileName)) {
            return false;
        }
        String path = readUrlUtils(type);
        path += fileName;
        try {
            FileUtil.writeBytes(file, path);
            return true;
        } catch (Exception e) {
            return false;
        }
    }


    /**
     * 删除文件
     *
     * @param fileName 删除文件的名称
     * @param type     文件类型，根据类型来确定文件的位置
     * @return 是否删除成功
     */
    public static boolean deleteImageUtils(String fileName, int type) {
        //文件名称是空白或者是null的时候就直接返回
        if (StrUtil.isBlank(fileName)) {
            return false;
        }
        String path = readUrlUtils(type);
        path += fileName;
        try {
            FileUtil.del(path);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 根据传入的类型来确定文件的位置
     *
     * @param type 文件类型
     * @return 通过文件类型返回文件夹路径
     */
    public static String readUrlUtils(int type) {

        try {
            return LOCATION.get(type);
        } catch (Exception e) {
            log.info("文件位置类型参数错误");
            return null;
        }
    }

    /**
     * 获取文件的后缀
     *
     * @param file 需要获取文件后缀的文件对象
     * @return 返回文件后缀，如：.png,.jpg
     */
    public static String getSuffixUtils(MultipartFile file) {
        String filename = file.getOriginalFilename();
        if (StrUtil.isNotBlank(filename)) {
            return filename.substring(filename.lastIndexOf("."));
        } else {
            return "";
        }
    }

    /**
     * 检测后缀是是否是一个图片格式
     *
     * @param suffix 指定的后缀
     * @return 是否是图片后缀
     */
    public static boolean suffixUtils(String suffix) {
        String[] s = {".PNG", ".JPG", ".GIF", ".JPEG"};
        suffix = suffix.toUpperCase();
        for (String ss : s) {
            if (suffix.equals(ss)) {
                return true;
            }

        }
        return false;
    }

    /**
     * 检测指定的字符串是否在指定的集合中
     *
     * @param str    需要检测的字符串后缀
     * @param suffix 后缀集合
     * @return 是否在其中
     */
    public static boolean suffixUtils(String str, String... suffix) {
        for (String ss : suffix) {
            if (str.equalsIgnoreCase(ss)) {
                return true;
            }

        }
        return false;
    }

    /**
     * 检测文件是否十图片格式，并生成与该文件的文件名称
     *
     * @param image 文件对象
     * @return 创建的图片名称
     */
    public static String createFileNameUtils(MultipartFile image) {
        String suffix = FileImageUtils.getSuffixUtils(image);
        //若果是图片格式保存
        if (suffixUtils(suffix)) {
            return IdUtils.getId() + suffix;
        } else {
            throw new ResultException(-1, "该文件不是图片格式");
        }

    }
}
